/**
 * 存储属性描述符和数据属性描述符的区别
 * 数据属性描述符：configurable + enumerable + writable + value
 * 存储属性描述符：configurable + enumerable + get + set
 *
 * 存储属性描述符的作用：
 * ①隐藏某一个私有属性不希望直接被外界使用和赋值
 * ②如果我们希望截获某一个属性他访问和设置的过程，也可以使用存储属性描述符
 *
 * vue2 的响应式就是利用的存储属性描述符来实现的
 */
var obj = {
  name: 'li',
  age: 18,
  //私有属性(社区默认以_开头的是私有属性)，没有严格意义的私有属性，Typescript中有
  _address: '昆明市'
}

Object.defineProperty(obj, 'address', {
  configurable: true,
  enumerable: true,
  get() {
    foo()
    return this._address
  },
  set(v) {
    bar()
    this._address = v
  }
})
console.log(obj.address)
obj.address = '曲靖市'
console.log(obj.address)

function foo() {
  console.log('获取了一次值')
}

function bar() {
  console.log('修改了一次值')
}
